Information Hiding (and Leakage)
データ構造やアルゴリズム、低レベルの詳細など
e.g. TCP ネットワークプロトコルの実装方法 や JSON の解析方法 インタフェースの単純化
システムの変更を容易に
モジュールの外には依存関係がないので、その情報に関する設計変更は、そのモジュール内で完結する getter や setter を通じて情報が公開される可能性があるため
情報を完全に隠蔽するのが理想
e.g. 一部のユーザだけ必要とする機能や情報
一般的な使い方からは見えないように、別のメソッドからアクセスされるようにする
いまいちイメージしづらい。以下のようなイメージ?radish-miyazaki.icon
code:ruby
class GraphicsLibrary
def initialize(image)
@image = image
end
def change_pixel(x, y, color)
# ここでピクセルの変更の実装が行われると仮定
end
def display_image
# 通常の使用ケースではピクセルの変更についての詳細は意識させない
puts "Displaying the image."
end
end
e.g. 特定のファイルフォーマットを処理する2つのクラス(Read / Write)
フォーマットが変われば、両方のクラスを修正する必要がある
影響を受けるクラスから情報だけを抜き出し、新しいクラスを作るアプローチも考えられる
この方法が有効なのは、詳細な情報を抽象化するシンプルなインタフェースを見つけられることできた場合にのみ有効
新しいクラスがインタフェースを通じて情報を公開してしまうと、価値は無い
クラスを少し大きくすることで改善できることが多い
一方で、大きすぎるクラスも問題である
大抵の場合、処理の順番は重要なのでアプリケーションのどこかに現れる
e.g. 異なるステップで異なる情報を用いるケース
モジュール設計を行うときは、処理の順番ではなく処理を実行するのに必要な知識に焦点を当てるべき
メソッドの設計
各メソッドがある情報や機能をカプセル化し、クラスの他の部分から見えないように隠蔽する インスタンス変数が使用される場所を減らす
クラス内の依存関係を軽減し、複雑さを減らすことが可能 どの情報がモジュール外に必要かを認識し、必要ならば公開することが重要
一方、ソフトウェア設計者としては、モジュール外に公開する情報を最小限にすることを目標とすべき
e.g. 設定パラメータによって、モジュールのパフォーマンスが異なるケース
モジュールが自動的に設定を調整できるのであれば、公開しない
調整できないのであれば、設定パラメータとして公開する
hr.icon
要約
逆にモジュールが情報を隠さない場合、モジュールはあまり機能を持たないか複雑なインタフェースを持つ
モジュール設計は、必要な知識単位でカプセル化されるように行う